library(readxl)
library(ppcor) # Para correlaciones parciales
library(dplyr)
library(ggplot2)
library(fastDummies) # Para crear variables dummy
7 Regresion lineal multiple
7.1 Introducción
Este documento presenta una guía detallada para el análisis de Regresión Lineal Múltiple a través de dos ejercicios prácticos. El primer ejercicio se centra en un modelo con predictores continuos, mientras que el segundo explora un modelo con predictores categóricos (ANOVA/ANCOVA). Se abordan todos los pasos del modelado: análisis descriptivo, estimación de parámetros, pruebas de hipótesis y construcción de intervalos de confianza.
7.1.1 Librerías Requeridas
8 EJERCICIO 1: Masa Corporal Magra en Atletas
Se busca modelar la masa corporal magra (lbm
) en función de la altura (ht
), el peso (wt
) y el recuento de glóbulos rojos (rcc
).
8.1 a) Análisis Descriptivo
Se inicia con una exploración de las relaciones entre las variables mediante diagramas de dispersión y matrices de correlación.
<- read_excel("Atletas.xlsx")
Atletas # View(Atletas)
# Matriz de diagramas de dispersión
plot(Atletas)
# Matriz de correlación de Pearson
cor(Atletas)
lbm ht wt rcc
lbm 1.00000000 0.71132706 0.93917965 0.08524203
ht 0.71132706 1.00000000 0.71506428 0.01460278
wt 0.93917965 0.71506428 1.00000000 0.02054923
rcc 0.08524203 0.01460278 0.02054923 1.00000000
# Matriz de correlaciones parciales
pcor(Atletas)
$estimate
lbm ht wt rcc
lbm 1.0000000 0.1687532 0.8798006 0.1947647
ht 0.1687532 1.0000000 0.1865226 -0.0329934
wt 0.8798006 0.1865226 1.0000000 -0.1646123
rcc 0.1947647 -0.0329934 -0.1646123 1.0000000
$p.value
lbm ht wt rcc
lbm 0.000000e+00 0.1002613 4.047452e-32 0.05722977
ht 1.002613e-01 0.0000000 6.881920e-02 0.74963535
wt 4.047452e-32 0.0688192 0.000000e+00 0.10900297
rcc 5.722977e-02 0.7496354 1.090030e-01 0.00000000
$statistic
lbm ht wt rcc
lbm 0.000000 1.6599295 17.944907 1.9251815
ht 1.659929 0.0000000 1.840707 -0.3200571
wt 17.944907 1.8407070 0.000000 -1.6180485
rcc 1.925182 -0.3200571 -1.618048 0.0000000
$n
[1] 98
$gp
[1] 2
$method
[1] "pearson"
8.2 c) Estimación de los Parámetros del Modelo
Se ajusta un modelo de Regresión Lineal Múltiple de la forma: \[ \text{lbm}_i = \beta_0 + \beta_1 \text{ht}_i + \beta_2 \text{wt}_i + \beta_3 \text{rcc}_i + \epsilon_i \] Los parámetros se estiman por Mínimos Cuadrados Ordinarios (MCO).
<- lm(lbm ~ 1 + ht + wt + rcc, data = Atletas)
fit summary(fit)
Call:
lm(formula = lbm ~ 1 + ht + wt + rcc, data = Atletas)
Residuals:
Min 1Q Median 3Q Max
-5.0163 -1.8628 0.1932 1.8690 6.0228
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.30797 6.71133 -0.195 0.8459
ht 0.06848 0.04126 1.660 0.1003
wt 0.56637 0.03156 17.945 <2e-16 ***
rcc 1.42480 0.74008 1.925 0.0572 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.359 on 94 degrees of freedom
Multiple R-squared: 0.8896, Adjusted R-squared: 0.8861
F-statistic: 252.6 on 3 and 94 DF, p-value: < 2.2e-16
# Intervalos de confianza para los coeficientes
confint(fit)
2.5 % 97.5 %
(Intercept) -14.63346824 12.0175228
ht -0.01343245 0.1503940
wt 0.50370761 0.6290412
rcc -0.04465812 2.8942516
8.3 d) Comprobación Matricial de los Parámetros
Los estimadores MCO pueden calcularse manualmente usando la notación matricial: \[ \hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T Y \]
<- dim(Atletas)[1]
n <- as.matrix(Atletas[, 1])
Y <- as.matrix(Atletas[, 2:4])
X <- cbind(rep(1, n), X) # Añadir columna de unos para el intercepto
X colnames(X)[1]<-"interc"
<- solve(t(X) %*% X) %*% t(X) %*% Y
betahat
# Comprobar si los cálculos manuales y los de lm() coinciden
all.equal(as.numeric(betahat), as.numeric(fit$coefficients))
[1] TRUE
8.4 e) Matriz de Varianzas y Covarianzas Estimada
La matriz de varianza-covarianza de los estimadores se calcula como: \[ \text{Var}(\hat{\boldsymbol{\beta}}) = \hat{\sigma}^2 (X^T X)^{-1} \] donde \(\hat{\sigma}^2 = \frac{SCE}{n-p}\) es la varianza residual estimada.
# Resultado de R
vcov(fit)
(Intercept) ht wt rcc
(Intercept) 45.04189942 -2.346794e-01 0.0971874453 -2.391439e+00
ht -0.23467939 1.701993e-03 -0.0009309838 3.986147e-06
wt 0.09718745 -9.309838e-04 0.0009961501 -3.377628e-04
rcc -2.39143869 3.986147e-06 -0.0003377628 5.477249e-01
# Cálculo manual
<- (1 / (n - 4)) * sum((Y - X %*% betahat)^2)
varhat <- varhat * solve(t(X) %*% X)
vcovbetahat
# Comprobar si son iguales
all.equal(as.numeric(vcovbetahat), as.numeric(vcov(fit)))
[1] TRUE
8.5 i) Prueba de Significancia Global del Modelo
Se evalúa si el modelo en su conjunto es significativo. - \(H_0\): \(\beta_1 = \beta_2 = \beta_3 = 0\) (El modelo no es significativo). - \(H_1\): Al menos un \(\beta_j \neq 0\).
# Opción 1: Usar el F-statistic de la salida de summary()
summary(fit)
Call:
lm(formula = lbm ~ 1 + ht + wt + rcc, data = Atletas)
Residuals:
Min 1Q Median 3Q Max
-5.0163 -1.8628 0.1932 1.8690 6.0228
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.30797 6.71133 -0.195 0.8459
ht 0.06848 0.04126 1.660 0.1003
wt 0.56637 0.03156 17.945 <2e-16 ***
rcc 1.42480 0.74008 1.925 0.0572 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.359 on 94 degrees of freedom
Multiple R-squared: 0.8896, Adjusted R-squared: 0.8861
F-statistic: 252.6 on 3 and 94 DF, p-value: < 2.2e-16
# Opción 2: Comparar el modelo completo con un modelo reducido (solo intercepto) usando anova()
<- lm(lbm ~ 1, data = Atletas)
fit0 anova(fit0, fit, test = "F")
Analysis of Variance Table
Model 1: lbm ~ 1
Model 2: lbm ~ 1 + ht + wt + rcc
Res.Df RSS Df Sum of Sq F Pr(>F)
1 97 4741.4
2 94 523.2 3 4218.2 252.59 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Conclusión: En ambas opciones, el p-valor es extremadamente pequeño, por lo que se rechaza \(H_0\). El modelo es globalmente significativo.
8.6 m) Prueba de Significancia de un Subconjunto de Variables
Se prueba si las variables ht
y rcc
son conjuntamente necesarias en el modelo. - \(H_0\): \(\beta_{ht} = \beta_{rcc} = 0\). - \(H_1\): Al menos uno de los dos coeficientes es distinto de cero.
# Se compara el modelo completo con un modelo reducido que excluye ht y rcc
<- lm(lbm ~ 1 + wt, data = Atletas)
fit1 anova(fit1, fit, test = "F")
Analysis of Variance Table
Model 1: lbm ~ 1 + wt
Model 2: lbm ~ 1 + ht + wt + rcc
Res.Df RSS Df Sum of Sq F Pr(>F)
1 96 559.21
2 94 523.24 2 35.964 3.2304 0.04397 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Conclusión: El p-valor pequeño indica que se rechaza \(H_0\). Las variables ht
y rcc
son conjuntamente significativas y deben permanecer en el modelo.
8.7 n) Prueba de Hipótesis Lineal: \(\beta_{ht} = \beta_{wt}\) ?
Se prueba si los efectos de la altura y el peso son iguales. - \(H_0\): \(\beta_{ht} - \beta_{wt} = 0\). - \(H_1\): \(\beta_{ht} - \beta_{wt} \neq 0\).
<- c(0, 1, -1, 0) # Vector para la combinación lineal
a <- t(a)%*%as.matrix(fit$coeff)/sqrt((t(a)%*%as.matrix(vcov(fit))%*%a))
t_C <- 2 * (1 - pt(abs(t_C), n - 4))
pval_n c(t_calculado = t_C, p_valor = pval_n)
t_calculado p_valor
-7.373079e+00 6.449596e-11
Conclusión: Se rechaza \(H_0\). Los efectos de la altura y el peso son significativamente diferentes.
8.8 o) Intervalo de Confianza del 95% para la Media
Se calcula un intervalo de confianza para el valor esperado de lbm
para un atleta con ht=170
, wt=70
y rcc=4.5
.
<- data.frame(ht = 170, wt = 70, rcc = 4.5)
nuevos_datos predict(fit, nuevos_datos, se.fit = TRUE, interval = "confidence", level = 0.95)
$fit
fit lwr upr
1 56.39155 55.67493 57.10817
$se.fit
[1] 0.3609235
$df
[1] 94
$residual.scale
[1] 2.359327
9 EJERCICIO 2: Índice de Placa Bacteriana (IPB)
Se busca modelar el IPB en función del grupo de tratamiento y el sexo del paciente, un ejemplo de modelo ANCOVA.
9.1 a) Estadísticas Descriptivas
<- read_excel("ipb.xlsx")
ipb_data head(ipb_data)
# A tibble: 6 × 3
grupo sexo ipb
<chr> <chr> <dbl>
1 Grupo1 F 1.2
2 Grupo1 F 1.43
3 Grupo1 F 1.1
4 Grupo1 F 1.45
5 Grupo1 F 0.95
6 Grupo1 F 2.75
# Resúmenes por grupo
%>%
ipb_data group_by(grupo, sexo) %>%
summarise(
n = n(),
media_ipb = mean(ipb),
sd_ipb = sd(ipb)
)
`summarise()` has grouped output by 'grupo'. You can override using the
`.groups` argument.
# A tibble: 6 × 5
# Groups: grupo [3]
grupo sexo n media_ipb sd_ipb
<chr> <chr> <int> <dbl> <dbl>
1 Grupo1 F 10 1.35 0.541
2 Grupo1 M 10 2.72 0.527
3 Grupo2 F 10 1.51 0.570
4 Grupo2 M 10 3.45 0.476
5 Grupo3 F 10 1.89 0.624
6 Grupo3 M 10 3.82 0.420
# Boxplot
boxplot(ipb ~ grupo * sexo, data = ipb_data,
xlab = "Grupo y Sexo", ylab = "IPB",
frame = FALSE, col = c("#00AFBB", "#E7B800", "#FC4E07"))
9.2 c) Estimación de Parámetros del Modelo
Se ajusta un modelo con predictores categóricos. R crea automáticamente las variables dummy. \[ \text{ipb}_i = \beta_0 + \beta_1 \text{grupo2}_i + \beta_2 \text{grupo3}_i + \beta_3 \text{sexoM}_i + \epsilon_i \] - \(\beta_0\) es la media del grupo de referencia (Grupo 1, Femenino). - Los otros \(\beta\) son los cambios promedio con respecto al grupo de referencia.
<- lm(ipb ~ 1 + grupo + sexo, data = ipb_data)
fit_ipb summary(fit_ipb)
Call:
lm(formula = ipb ~ 1 + grupo + sexo, data = ipb_data)
Residuals:
Min 1Q Median 3Q Max
-1.22478 -0.29049 0.02787 0.27287 1.58787
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.1621 0.1390 8.361 1.98e-11 ***
grupoGrupo2 0.4464 0.1702 2.622 0.0112 *
grupoGrupo3 0.8225 0.1702 4.832 1.09e-05 ***
sexoM 1.7457 0.1390 12.560 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.5383 on 56 degrees of freedom
Multiple R-squared: 0.7639, Adjusted R-squared: 0.7512
F-statistic: 60.38 on 3 and 56 DF, p-value: < 2.2e-16
9.3 d) ¿El IPB depende del Grupo?
Se prueba si los coeficientes asociados a los grupos son conjuntamente cero. - \(H_0\): \(\beta_{grupo2} = \beta_{grupo3} = 0\).
# Se compara el modelo completo con un modelo reducido sin la variable 'grupo'
<- lm(ipb ~ 1 + sexo, data = ipb_data)
fit_reducido_grupo anova(fit_reducido_grupo, fit_ipb, test = "F")
Analysis of Variance Table
Model 1: ipb ~ 1 + sexo
Model 2: ipb ~ 1 + grupo + sexo
Res.Df RSS Df Sum of Sq F Pr(>F)
1 58 23.011
2 56 16.229 2 6.782 11.701 5.674e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Conclusión: El p-valor es muy pequeño, se rechaza \(H_0\). El grupo tiene un efecto significativo en el IPB.
9.4 e) ¿El IPB depende del Sexo?
Se prueba si el coeficiente asociado al sexo es cero. - \(H_0\): \(\beta_{sexoM} = 0\).
# Se puede juzgar directamente por el p-valor de 'sexoM' en summary(fit_ipb)
summary(fit_ipb)
Call:
lm(formula = ipb ~ 1 + grupo + sexo, data = ipb_data)
Residuals:
Min 1Q Median 3Q Max
-1.22478 -0.29049 0.02787 0.27287 1.58787
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.1621 0.1390 8.361 1.98e-11 ***
grupoGrupo2 0.4464 0.1702 2.622 0.0112 *
grupoGrupo3 0.8225 0.1702 4.832 1.09e-05 ***
sexoM 1.7457 0.1390 12.560 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.5383 on 56 degrees of freedom
Multiple R-squared: 0.7639, Adjusted R-squared: 0.7512
F-statistic: 60.38 on 3 and 56 DF, p-value: < 2.2e-16
Conclusión: El p-valor (0.13) es mayor que 0.05. No hay evidencia de que el sexo tenga un efecto significativo en el IPB, después de controlar por el grupo.
9.5 f) ¿Hay Interacción entre Sexo y Grupo?
Se prueba si el efecto del grupo sobre el IPB es el mismo para hombres y mujeres. - \(H_0\): No hay interacción.
# Se ajusta un modelo con el término de interacción
<- lm(ipb ~ 1 + grupo + sexo + grupo:sexo, data = ipb_data)
fit_interaccion summary(fit_interaccion)
Call:
lm(formula = ipb ~ 1 + grupo + sexo + grupo:sexo, data = ipb_data)
Residuals:
Min 1Q Median 3Q Max
-1.13275 -0.31603 -0.04393 0.24413 1.40200
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.3480 0.1677 8.037 8.61e-11 ***
grupoGrupo2 0.1667 0.2372 0.703 0.4852
grupoGrupo3 0.5446 0.2372 2.296 0.0256 *
sexoM 1.3740 0.2372 5.792 3.66e-07 ***
grupoGrupo2:sexoM 0.5594 0.3355 1.668 0.1012
grupoGrupo3:sexoM 0.5558 0.3355 1.657 0.1034
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.5304 on 54 degrees of freedom
Multiple R-squared: 0.7789, Adjusted R-squared: 0.7585
F-statistic: 38.05 on 5 and 54 DF, p-value: < 2.2e-16
# Se comparan los modelos con y sin interacción
anova(fit_ipb, fit_interaccion, test = "F")
Analysis of Variance Table
Model 1: ipb ~ 1 + grupo + sexo
Model 2: ipb ~ 1 + grupo + sexo + grupo:sexo
Res.Df RSS Df Sum of Sq F Pr(>F)
1 56 16.229
2 54 15.192 2 1.0364 1.8419 0.1683
Conclusión: El p-valor (0.55) es grande. No hay evidencia de un efecto de interacción significativo.